//============================================================================
// Name        : LogSystem.cpp
// Author      : ferranferri
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include "Log/LogSystem.h"
using namespace std;

int main() {
	glog::CGlobalLog::initSingleton();
	glog::CGlobalLog& g_log = glog::CGlobalLog::getSingleton();
	g_log.setMiniumLevel(glog::LOGLEVEL_DEBUG);
	cout << "Minimum level is: " << glog::levelToString(g_log.getMinimunLevel()) << " \n";

	// añadiendo algunos appenders
	g_log.addAppender("MY_APPENDER");
	g_log.addAppender("MY_APPENDER001");
	g_log.addAppender("MY_APPENDER002");
	g_log.addAppender("MY_APPENDER003");
	g_log.addAppender("MY_APPENDER002");

	// Ahora los recupero y compruebo que estan bien
	std::list<std::string> l = g_log.getAppenderList();
	for(std::list<std::string>::iterator it = l.begin(); it != l.end(); it++)
	{
		std::cout << *it << "\n";
	}

	// Pongo mensajes en un appender que existe, sobre un Writer que existe.
	g_log.addListener(new glog::CLogWriter("test.log",glog::LOGLEVEL_DEBUG),"MY_APPENDER");
	g_log.addMessage("MY_APPENDER",glog::LOGLEVEL_INFO,"Esto es una linea de prueba #1");
	g_log.addMessage("MY_APPENDER",glog::LOGLEVEL_INFO,"Esto es una linea de prueba #2");
	g_log.addMessage("MY_APPENDER",glog::LOGLEVEL_INFO,"Esto es una linea de prueba #3");
	g_log.addMessage("MY_APPENDER",glog::LOGLEVEL_INFO,"Esto es una linea de prueba #4");

	// Pongo mensajes en otro appender sin un listener
	g_log.addMessage("MY_APPENDER001",glog::LOGLEVEL_INFO,"Esto es una linea de prueba #5");
	g_log.addMessage("MY_APPENDER001",glog::LOGLEVEL_INFO,"Esto es una linea de prueba #6");
	g_log.addMessage("MY_APPENDER001",glog::LOGLEVEL_INFO,"Esto es una linea de prueba #7");
	g_log.addMessage("MY_APPENDER001",glog::LOGLEVEL_INFO,"Esto es una linea de prueba #8");

	// Un mismo listener se suscribe a dos colas de mensajes.
	glog::IListener* i = new glog::CLogWriter("test2.log", glog::LOGLEVEL_INFO);
	g_log.addListener(i,"MY_APPENDER002");
	g_log.addListener(i,"MY_APPENDER003");
	g_log.addMessage("MY_APPENDER002",glog::LOGLEVEL_INFO,"Esto es una linea de prueba #10");
	g_log.addMessage("MY_APPENDER002",glog::LOGLEVEL_INFO,"Esto es una linea de prueba #11");
	g_log.addMessage("MY_APPENDER002",glog::LOGLEVEL_INFO,"Esto es una linea de prueba #12");
	g_log.addMessage("MY_APPENDER002",glog::LOGLEVEL_INFO,"Esto es una linea de prueba #13");
	g_log.addMessage("MY_APPENDER003",glog::LOGLEVEL_INFO,"Esto es una linea de prueba #14");
	g_log.addMessage("MY_APPENDER003",glog::LOGLEVEL_INFO,"Esto es una linea de prueba #15");
	g_log.addMessage("MY_APPENDER003",glog::LOGLEVEL_INFO,"Esto es una linea de prueba #16");
	g_log.addMessage("MY_APPENDER003",glog::LOGLEVEL_INFO,"Esto es una linea de prueba #17");

	g_log.setMiniumLevel(glog::LOGLEVEL_DEBUG);
	g_log.DEBUG_MSG("MY_APPENDER002","Esto es un mensaje de DEBUG con %d %s",2,"paramentros"); // Este no debe salir en el log puesto que este mensaje es de nivel DEBUG.
	g_log.INFO_MSG("MY_APPENDER002","Esto es un mensaje de INFO con %d %s",3,"paramentros");
	g_log.WARNING_MSG("MY_APPENDER002","Esto es un mensaje de WARNINIG con %d %s",4,"paramentros");

	g_log.processMessages();
	cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
	g_log.processMessages();
	return 0;
}
